/*
 * GraphicUserInterface.cpp
 *
 *  Created on: 27/09/2009
 *      Author: mario
 */

#include "GraphicUserInterface.h"


GraphicUserInterface::GraphicUserInterface() {

}

GraphicUserInterface::~GraphicUserInterface() {

}

int spacer()
{
  int i;

  for ( i = 0; i < SEPARATION; i++ )
    putchar ( '\n' );

  return 0;
}

void printHeader(string msg){
	cout << SPACER;
	cout << msg;
	cout << SPACER;
	putchar ( '\n' );

}

void printMainMenu(int openFiles){
	printHeader("                       MENU DE OPCIONES                      \n");

    cout << "   1- Carga De Archivos\n";
    spacer();
    if(openFiles){
    	cout << "   2- Obtener Camino Mas Rapido\n";
    	spacer();
    	cout << "   3- Obtener Camino Mas Corto\n";
		spacer();
		cout << "   4- Salir\n";
    }else{
    	cout << "   2- Salir\n";
    }

    putchar ( '\n' );
    cout << SPACER;
    cout << "Su eleccion: ";
}

void printFileMenu(){
	printHeader("                         Carga De Archivos\n");

    cout << "   1- Carga Archivos Del Grafo\n";

    spacer();

    cout << "   2- Salir\n";

    cout << SPACER;
	cout << "Su eleccion: ";
}

int loadHandler(ifstream* fileV, ifstream* fileE){
	int option;

	printFileMenu();
	cin >> option
	;
	if(option == 1){

		if(fileV->is_open()){
			fileV->close();
		}
		if(fileE->is_open()){
			fileE->close();
		}

		string vertexFile;
		string edgeFile;

		int exit = 0;
		char selection;

		while(!exit){
			cin.ignore();
			cout << '\n';
			cout << "Ingrese el directorio en el que se encuentra el archivo de vertices: ";
			getline(cin, vertexFile);

			fileV->open(vertexFile.c_str(), ifstream::out);

			if (!fileV->is_open()) {
				cout << "El archivo no existe no es valido,desea intentarlo nuevamente [y/n]: ";
				cin >> selection;
				if(selection != 'y'){
					return 0;
				}
			}else{
				exit=1;
			}

		}

		exit = 0;

		while(!exit){
			cout << '\n';
			cout << "Ingrese el directorio en el que se encuentra el archivo de aristas: ";
			getline(cin, edgeFile);
			fileE->open(edgeFile.c_str(), ifstream::out);

			if (!fileE->is_open()) {
				cout << "El archivo no existe no es valido, desea intentarlo nuevamente [y/n]: ";
				cin >> selection;
				if(selection != 'y'){
					return 0;
				}
				cin.ignore();
			}else{
				exit=1;
			}

		}

		return 1;
	}
	return 0;

}

void printNodeMenu(int option){
	if(option == 2){
		printHeader("                       OBTENCION CAMINO RAPIDO\n");
	}else{
		printHeader("                       OBTENCION CAMINO CORTO\n");
	}

}

void GraphicUserInterface::searchNodepath(int option){
	printNodeMenu(option);
	std::string originNode;
	std::string finalNode;
	char search;
	do {
		cout << "Ingrese el Nodo de Origen:";
		cin >> originNode;

		cout << "Ingrese el Nodo de Llegada:";
		cin >> finalNode;

		if ( graph->getVertex(originNode) == NULL || graph->getVertex(finalNode) == NULL) {
			if (graph->getVertex(originNode) == NULL) {
				cout << "No se encontro el vertice de origen. Desea realizar nuevamente la busqueda [y/n]: ";
			} else {
				cout << "No se encontro el vertice de destino. Desea realizar nuevamente la busqueda [y/n]: ";
			}
		} else {
			GraphManager* graphManager = new GraphManager(graph);
			List* path = NULL;
			if (option == 2) {
				path = graphManager->getFastestPath(originNode, finalNode);
			}
			if (option == 3) {
				path = graphManager->getShortestPath(originNode, finalNode);
			}
			printResults(path);
			cout << "\n";
			cout << "Desea realizar otra busqueda [y/n]: ";
		}
		cin >> search;
		cout << '\n';

	} while (search != 'n');

}

void GraphicUserInterface::menu(){
	int option;
	int logout = 0;

	int openedFiles = 0;
	ifstream fileV;
	ifstream fileE;
	InputManager* inputManager = NULL;


	while(logout != 1) {

		printMainMenu(openedFiles);


		cin >> option;
		fflush(stdin);

		switch(option){

		case 1:
			   if (loadHandler(&fileV, &fileE) == 2) {
				   logout = 1;
			   }

			   if (fileE.is_open() && fileV.is_open()) {
				   openedFiles = 1;
			   } else {
				   openedFiles = 0;
			   }

			   inputManager = new InputManager(&fileV, &fileE);
			   graph = inputManager->createGraph();

			   break;
		// fastest path
		case 2:
				if(!openedFiles){
					logout = 1;
					break;
				}

				searchNodepath(option);

				break;
		// shortest path
		case 3:
				if(!openedFiles){
					logout = 1;
					break;
				}

				searchNodepath(option);

				break;

		default:
			logout = 1;
			break;

		}
	}
	if(inputManager != NULL){
		delete inputManager;
	}
}

void GraphicUserInterface::printResults(List* vertexListPath) {
	if (vertexListPath->getSize() == 0) {
		cout << "No existe conexion entre el vertice de origen y el de destino";
		return;
	}
	cout << "|\tID\t|\tdist. al nodo\t|\tdist. parcial\t|\ttiempo al nodo\t|\ttiempo parcial\t|\n";
	float partialDistance = 0.0;
	float partialTime = 0.0;
	for (int i = vertexListPath->getSize() - 1; i >= 0; i-- ) {
		cout << ((VertexNode*)vertexListPath->get(i))->getNodeValue()->getId() << "\n";
	}
}
